package medium.string;

/**
 * <a href="https://leetcode-cn.com/problems/longest-palindromic-substring">5. 最长回文子串</a>
 * 给你一个字符串 s，找到 s 中最长的回文子串。
 * 示例 1：
 *   输入：s = "babad"
 *   输出："bab"
 *   解释："aba" 同样是符合题意的答案。
 * 示例 2：
 *   输入：s = "cbbd"
 *   输出："bb"
 * 示例 3：
 *   输入：s = "a"
 *   输出："a"
 * 示例 4：
 *   输入：s = "ac"
 *   输出："a"
 * 提示：
 *   1 <= s.length <= 1000
 *   s 仅由数字和英文字母（大写和/或小写）组成
 * @author 刘学松
 * @date 2021/2/13 11:32
 */
public class 最长回文子串 {
    public static void main(String[] args) {
        System.out.println(longestPalindrome("babad"));
    }

    public static String longestPalindrome(String s) {
        // TODO
        String result = "";
        int length = s.length();
        boolean[][] dp = new boolean[length][length];
        // subLength 子串首尾间隔长度，0~length
        for (int subLength = 0; subLength < length; ++subLength) {
            // i 子串起始下标，0~length-subLength
            for (int i = 0; i < length - subLength; i++) {
                // j 子串结束下标
                int j = i + subLength;
                // 子串首尾间隔为0，表示i=j，必然为回文串
                if (subLength == 0) {
                    dp[i][j] = true;
                } else if (subLength == 1) {
                    // 字符串首尾间隔为1，表示i和j相邻，判断ij所在字符是否相等，相等则为回文串
                    dp[i][j] = s.charAt(i) == s.charAt(j);
                } else {
                    // 字符串首尾间隔大于1，即ij之间最少隔了2个字符，判断ij所在字符是否相等，且ij之间的子串是否相等，都相等则为回文串
                    dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1];
                }
                // ij字符串为回文，且新子串更长，则更新子串
                if (dp[i][j] && subLength + 1 > result.length()) {
                    result = s.substring(i, i + subLength + 1);
                }
            }
        }
        return result;
    }
}
